package com.gongzonqiang.service;

import java.util.List;

import com.github.pagehelper.PageInfo;
import com.gongzonqiang.pojo.Category;
import com.gongzonqiang.pojo.Collection;
import com.gongzonqiang.pojo.Comment;
import com.gongzonqiang.pojo.Notice;
import com.gongzonqiang.pojo.Price;
import com.gongzonqiang.pojo.User;
import com.gongzonqiang.povo.CommentVo;
import com.gongzonqiang.povo.NoticeVo;

public interface NoticeService {
	
	
	/**
	 *查看公告详情
	 * @param noticeId 公告id
	 * @return 公告信息Vo (包含公告信息,发布公告用户基本信息(昵称,头像,电话),评论(评论人昵称,头像,评论内容,评论时间))
	 */
	NoticeVo noticeDesc(Long noticeId);
	
	/**
	 * 公告列表(首页)(包含轮播公告(公告编号,图片链接)		 获取轮播图公告
	 * @return 首页Vo对象
	 */
	List<Notice> listNoticeForIndex();
	
	/**
	 * 通用查詢Notice表中数据
	 * 
	 * @param pageNum  第几页
	 * @param pageSize 多少条记录
	 * @param notice   公告Vo实体对象
	 * @param order 0置顶优先,其次时间  1置顶优先其次浏览数
	 * @return 公告Vo实体对象(分页)
	 */
	public PageInfo<NoticeVo> selectNoticeVo(int pageNum, int pageSize, NoticeVo notice,Integer order, boolean isAdmin);
	
	/**
	 * 查看分类下的商品
	 * @param categoryId 分类id
	 * @return 公告信息Vo(置顶和非置顶;包含公告信息,发布公告用户基本信息(昵称,头像,电话);分页)
	 */
	public PageInfo<NoticeVo> listNoticeByCategory(int pageNum, int pageSize, int order,Long categoryId);
	
	/**
	 * 搜索公告(条件可以为:公告内容,用户名称,公告id)
	 * @param notice 公告实体对象
	 * @return 公告信息Vo(置顶和非置顶;包含公告信息,发布公告用户基本信息(昵称,头像,电话);分页)
	 */
	PageInfo<NoticeVo> searchNotice(int pageNum,int pageSize,NoticeVo notice);
	
	/**
	 * 管理员修改公告
	 * @param notice 公告实体对象
	 * @return 
	 */
	int updateNotice(Notice notice);

	/**
	 * 评论公告(同时要创建一条消息通知)
	 * @param comment 评论实体对象
	 * @param user 用户实体对象
	 * @return 0失败 1成功
	 */
	int comment(Comment comment,User user);
	
	/**
	 * 用户删除自己的评论
	 * @param commentId 评论编号
	 * @param user 用户实体
	 * @return 0失败 1成功
	 */
	int delComment(Long commentId,User user);
	
	/**
	 * 发布公告(若想置顶但未支付成功,删除该公告并返回提交公告页面)
	 * @param notice 公告实体对象
	 * @param user 用户实体对象
	 * @return 0失败 1成功
	 */
	int release(Notice notice,User user);
	
	/**
	 * 用户删除自己发布的公告
	 * @param noticeId 公告id
	 * @param user 用户实体对象
	 * @return 0失败 1成功
	 */
	int delNotice(Long noticeId,User user);
	
	/**
	 * 管理员删除发布的公告
	 * @param noticeId 公告id
	 * @param user 用户实体对象
	 * @return 0失败 1成功
	 */
	int delNoticeByAdmin(Long noticeId);
	
	/**
	 *用户收藏公告
	 * @param noticeId 公告id
	 * @param user 用户实体对象
	 * @return 0失败 1成功
	 */
	Collection collect(Long noticeId,User user);
	
	/**
	 * 用户删除自己的收藏
	 * @param collectionId 收藏编号
	 * @param user 用户实体对象
	 * @return 0失败 1成功
	 */
	int delCollection(Long collectionId,User user);
	
	//分享
	

	/**
	 * 公告列表(后台管理) (可以使用的条件:分类,名称)
	 * @param notice 公告Vo实体对象
	 * @return 公告Vo对象信息(公告信息(包含公告信息,昵称,电话)(分页))
	 */
	PageInfo<NoticeVo> listNotice(int pageNum,int pageSize,NoticeVo notice,User user);
	
	/**
	 * 审核(通过,不通过),逻辑删除(管理员操作)
	 * @param noticeId 公告编号
	 * @param status 状态-1不通过 0审核 1发布- 2逻辑删除
	 * @return 0失败 1成功
	 */
	int checkCollection(Long noticeId,int status);
	
	/**
	 * 删除评论
	 * @param commentId 评论编号
	 * @param user 管理员账号
	 * @return 0失败 1成功
	 */
	int delComeentByAdmin(Long commentId);
	
	/**
	 * 查看公告下的评论
	 * @param noticeId 公告id
	 * @return 评论Vo信息(发布公告用户头像和姓名,评论内容,评论时间)(分页)
	 */
	PageInfo<CommentVo> commentByNoticeId(int pageNum,int pageSize,Long noticeId);
	
	/**
	 * 设置公告轮播天数(管理员操作)(为0则取消轮播)
	 * @param noticeId 公告编号
	 * @param carouselDay 轮播天数
	 * @return 0失败 1成功
	 */
	int setCarousel(Long noticeId,int carouselDay);

	/**
	 * 分类列表
	 * @return 分类信息(分页)(虽然分类可能会很少,但习惯用了PageInfo,再用其他的也很麻烦)
	 */
	PageInfo<Category> listCategory(int pageNum,int pageSize);
	
	/**
	 * 更新分类 删除分类(此删除为逻辑删除,其类下的公告也暂时进入审核中状态)
	 * @param category 分类实体对象(封装分类信息)
	 * @return 0失败 1成功
	 */
	int updateCategory(Category category);
	
	/**
	 *添加分类
	 * @param category 分类实体对象(封装分类信息)
	 * @return 0失败 1成功
	 */
	int insertCategory(Category category);
	
	
	/**
	 * 根据分类id获取分类
	 * @param cid
	 * @return
	 */
	public Category selectCategoryByCid(Long cid);
	
	/**
	 *价格列表
	 * @return 价格信息(分页)
	 */
	PageInfo<Price> listPrice(int pageNum,int pageSize);
	
	/**
	 * 添加价格
	 * @param price 价格实体对象
	 * @return 0失败 1成功
	 */
	int insertPrice(Price price,User user);
	
	/**
	 * 删除价格(真删,没人使用这个价格才能删)
	 * @param priceId 价格编号
	 * @return 0失败 1成功
	 */
	int delPrice(int priceId,User user);
	
	/**
	 * 更新价格
	 * @param price 价格实体
	 * @return 0失败 1成功
	 */
	int updatePrice(Price price,User user);
	
	/**
	 *判断用户是否收藏 
	 * @param noticeId 公告编号
	 * @param user 用户实体
	 * @return 
	 */
	Collection isCollect(Long noticeId, User user);
	
}
